package com.nd.teamfile.fileexplorer.util;

import java.io.File;
import java.text.DateFormat;
import java.util.Date;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Environment;

import com.nd.teamfile.fileexplorer.sdk.type.FileExplorerInfo;

public class FileExplorerUtil {

	// 根目录路径
	public static final String ROOT_PATH = "/";

	// 官方app2sd文件，为了防止用户操作
	private static String ANDROID_SECURE = ".android_secure";

	public static boolean isSDCardReady() {
		return Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED);
	}

	/**
	 * 判断是否是普通文件(ANDROID_SECURE文件不允许用户操作，否则可能造成SD卡内的软件无法使用)
	 * 
	 * @n<b>函数名称</b> :isNormalFile
	 * @brief
	 * @see
	 * @version Ver 1.3.3
	 * @param @param fullName
	 * @param @return
	 * @return boolean
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-1-24上午10:48:55
	 */
	public static boolean isNormalFile(String fullName) {
		return fullName.indexOf(ANDROID_SECURE) == -1;
	}

	/**
	 * 根据文件路径获取文件信息
	 * 
	 * @n<b>函数名称</b> :GetFileInfo
	 * @brief
	 * @see
	 * @version Ver 1.3.3
	 * @param @param filePath
	 * @param @return
	 * @return FileInfo
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-1-25下午12:57:06
	 */
	public static FileExplorerInfo GetFileInfo(String filePath) {
		File lFile = new File(filePath);
		if (!lFile.exists())
			return null;

		FileExplorerInfo lFileInfo = new FileExplorerInfo();
		lFileInfo.fileName = FileExplorerUtil.getNameFromFilepath(filePath);
		lFileInfo.ModifiedDate = lFile.lastModified();
		lFileInfo.IsDir = lFile.isDirectory();
		lFileInfo.filePath = filePath;
		lFileInfo.fileSize = lFile.length();
		return lFileInfo;
	}

	/**
	 * 根据文件对象获取文件信息
	 * 
	 * @n<b>函数名称</b> :GetFileInfo
	 * @brief
	 * @see
	 * @version Ver 1.3.3
	 * @param @param f
	 * @param @param showHidden
	 * @param @return
	 * @return FileInfo
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-1-25下午12:54:07
	 */
	public static FileExplorerInfo GetFileInfo(File f) {
		FileExplorerInfo lFileInfo = new FileExplorerInfo();
		String filePath = f.getPath();
		File lFile = new File(filePath);
		lFileInfo.fileName = f.getName();
		lFileInfo.ModifiedDate = lFile.lastModified();
		lFileInfo.IsDir = lFile.isDirectory();
		lFileInfo.filePath = filePath;
		if (lFileInfo.IsDir) {
			int lCount = 0;
			File[] files = lFile.listFiles();

			// 如果为空表示无法访问这个目录
			if (files == null) {
				return null;
			}

			for (File child : files) {
				if (FileExplorerUtil.isNormalFile(child.getAbsolutePath())) {
					lCount++;
				}
			}
			lFileInfo.Count = lCount;
		} else {
			lFileInfo.fileSize = lFile.length();
		}
		return lFileInfo;
	}

	/**
	 * 取APK的图标。注意：android中取apk图标存在的一个BUG,通过 appInfo.publicSourceDir =
	 * apkPath;来修正这个问题，详情参见:
	 * http://code.google.com/p/android/issues/detail?id=9151
	 * 
	 * @n<b>函数名称</b> :getApkIcon
	 * @brief
	 * @see
	 * @version Ver 1.3.3
	 * @param @param context
	 * @param @param apkPath
	 * @param @return
	 * @return Drawable
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-1-24上午10:50:40
	 */
	public static Drawable getApkIcon(Context context, String apkPath) {
		PackageManager pm = context.getPackageManager();
		PackageInfo info = pm.getPackageArchiveInfo(apkPath,
				PackageManager.GET_ACTIVITIES);
		if (info != null) {
			ApplicationInfo appInfo = info.applicationInfo;
			appInfo.sourceDir = apkPath;
			appInfo.publicSourceDir = apkPath;
			try {
				return appInfo.loadIcon(pm);
			} catch (OutOfMemoryError e) {
				System.gc();
				return null;
			}
		}
		return null;
	}

	/**
	 * 根据文件名获取文件扩展类型
	 * 
	 * @n<b>函数名称</b> :getExtFromFilename
	 * @brief
	 * @see
	 * @version Ver 1.3.3
	 * @param @param filename
	 * @param @return
	 * @return String
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-1-24下午9:15:43
	 */
	public static String getExtFromFilename(String filename) {
		int dotPosition = filename.lastIndexOf('.');
		if (dotPosition != -1) {
			return filename.substring(dotPosition + 1, filename.length());
		}
		return "";
	}

	/**
	 * 根据文件完整名称获取文件的名字
	 * 
	 * @n<b>函数名称</b> :getNameFromFilename
	 * @brief
	 * @see
	 * @version Ver 1.3.3
	 * @param @param filename
	 * @param @return
	 * @return String
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-1-24下午9:16:13
	 */
	public static String getNameFromFilename(String filename) {
		int dotPosition = filename.lastIndexOf('.');
		if (dotPosition != -1) {
			return filename.substring(0, dotPosition);
		}
		return "";
	}

	/**
	 * 获取文件的路径
	 * 
	 * @n<b>函数名称</b> :getPathFromFilepath
	 * @brief
	 * @see
	 * @version Ver 1.3.3
	 * @param @param filepath
	 * @param @return
	 * @return String
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-1-24下午9:22:50
	 */
	public static String getPathFromFilepath(String filepath) {
		int pos = filepath.lastIndexOf('/');
		if (pos != -1) {
			return filepath.substring(0, pos);
		}
		return "";
	}

	/**
	 * 根据文件路径获得文件名
	 * 
	 * @n<b>函数名称</b> :getNameFromFilepath
	 * @brief
	 * @see
	 * @version Ver 1.3.3
	 * @param @param filepath
	 * @param @return
	 * @return String
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-1-24下午9:23:17
	 */
	public static String getNameFromFilepath(String filepath) {
		int pos = filepath.lastIndexOf('/');
		if (pos != -1) {
			return filepath.substring(pos + 1);
		}
		return "";
	}

	/**
	 * 逗号分隔符
	 * 
	 * @n<b>函数名称</b> :convertNumber
	 * @brief
	 * @see
	 * @version Ver 1.3.3
	 * @param @param number
	 * @param @return
	 * @return String
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-1-25下午12:59:14
	 */
	public static String convertNumber(long number) {
		return String.format("%,d", number);
	}

	/**
	 * 存储格式转换(GB/MB/KB/B)
	 * 
	 * @n<b>函数名称</b> :convertStorage
	 * @brief
	 * @see
	 * @version Ver 1.3.3
	 * @param @param size
	 * @param @return
	 * @return String
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-1-25下午12:59:24
	 */
	public static String convertStorage(long size) {
		long kb = 1024;
		long mb = kb * 1024;
		long gb = mb * 1024;

		if (size >= gb) {
			return String.format("%.1f GB", (float) size / gb);
		} else if (size >= mb) {
			float f = (float) size / mb;
			return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
		} else if (size >= kb) {
			float f = (float) size / kb;
			return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
		} else
			return String.format("%d B", size);
	}

	public static String formatDateString(Context context, long time) {
		DateFormat dateFormat = android.text.format.DateFormat
				.getDateFormat(context);
		DateFormat timeFormat = android.text.format.DateFormat
				.getTimeFormat(context);
		Date date = new Date(time);
		return dateFormat.format(date) + " " + timeFormat.format(date);
	}
}
